<?php

/**
 * User_RegistrationController
 *
 * Регистрация нового пользователя
 *
 * @package   Basic
 * @author    Игорь Будасов aka Lord <igor.budasov@gmail.com>
 * @copyright Игорь Будасов aka Lord <igor.budasov@gmail.com>
 */

class User_RegistrationController extends Lord_Controller_Action
{

/*------------------------------------------------------------------------------*/

	/**
	 * Индексный метод.
	 * Отображение списка юзеров
	 */

	public function indexAction()
	{
		$this->view->users = $this->model->fetchAll('id != 1');
		return;
	}

/*------------------------------------------------------------------------------*/

	/**
	* Добавление юзера
	*/

	public function addAction()
	{
		return $this->_process('add');
	}


/*------------------------------------------------------------------------------*/

	/**
	* Редактирование юзера
	*/

	public function editAction()
	{
		// получаем данные для заполнения формы
		$model = new User();
		$data = $model
				->fetchRow('id=' . $this->_checkId())
				->toArray();

		// если в $data пусто - нам пытаются скормить что-то не то
		if(empty($data))
			return $this->view->assign('err', 'user_registration_edit_fail');

		// и отдаем на редактирование
		return $this->_process('edit', $data);
	}


/*------------------------------------------------------------------------------*/

	/**
	* Удаление
	*/

	function deleteAction()
	{
		// проверяем айдишник
		$id = $this->_checkId();

		// получаем модель
		$model = new User();

		// отправляем данные в шаблон
		$this->view->deluser = $model->fetchRow('id='.$id);

		if ($this->_request->isPost())
		{
			// если юзер подтвердил - удаляем
			if ($this->_request->getPost('conf') == 'ok')
			{
				$model->delete('id = ' . $id);
			}
		}
		else
		{
			// если в $this->view->deluser пусто - нам пытаются скормить левый $id
			if(empty($this->view->deluser))
				return $this->view->assign('err', 'user_registration_delete_fail');
			else
				return;
		}

		// возвращаемся на главную страницу
		$this->_redirect('user/registration');
	}

/*==============================================================================*/

	/**
	* Приватный метод для обработки
	* добавления и редактирования
	*
	* @param string $action
	* @param array $data
	* @return void
	*/

	private function _process($action = 'add', $data = array())
	{
		// показываем форму
		$form = $this->_form($data, array(), $action);
		$this->view->assign('form', $form);

		// получаем модель
		$model = new User();

		// валидация
		if (!empty($_POST))
		{
			if (!$form->isValid($_POST))
			{
				// получаем невалидные значения, введенные в форму
				$values = $form->getUnfilteredValues();
				// получаем ошибки
				$errors = $form->getErrors();
				// сообщение
				$this->view->assign('err', 'form_fail');
				// показываем форму с невалидными данными
				return $this->view->assign('form', $this->_form($values, $errors, $action));
			}
		}

		/**
		* обрабатываем форму
		*/
		// если к нам что-то пришло из поста
		if ($this->_request->isPost())
		{
			// получаем корректные данные, введенные юзером
			$values = $form->getValues();

			// кладем в базу
			if($action == 'add')
			{
				// выбираем нужные данные для добавления
				$data['email']            = $values['email'];
				$data['password']         = md5($values['password']);
				$data['name']             = $values['name'];
				$data['sex']              = $values['sex'];
				$data['date_birth']       = $values['date_birth'];
				$data['age']              = $values['age'];
				$data['about']            = $values['about'];

				// кладем в базу
				$model->insert($data);
				//$this->_redirect($this->_moduleName);

				// сообщение
				$this->view->assign('msg', 'user_registration_add_ok');
				return;
			}
			if($action == 'edit')
			{
				// выбираем нужные данные для добавления
				$data['email']            = $values['email'];
				$data['name']             = $values['name'];
				$data['sex']              = $values['sex'];
				$data['date_birth']       = $values['date_birth'];
				$data['age']              = $values['age'];
				$data['about']            = $values['about'];
				$data['role']             = $values['role'];

				// кладем в базу
				$model->update($data, 'id='.$values['id']);
				$this->_redirect('user/registration');

				// сообщение
				//$this->view->assign('msg', 'user_registration_edit_ok');
				return;
			}
		}
	}

/*------------------------------------------------------------------------------*/

	/**
	* Приватный метод для проверки айдишника записи
	*/

	private function _checkId()
	{
		$id = $this->_getParam('id');

		if( $id == false
			or $id == null
			or empty($id)
			or !isset($id))
		{
			return 0;
		}
		else
		{
			return (int)$id;
		}
	}

/*------------------------------------------------------------------------------*/

	/**
	* Приватный метод для построения формы
	* Используется при добавлении и редактировании
	* В качестве аргумента принимает уже заполненые
	* данные (при редактировании)
	*
	* @param $data array
	* @param $errors array
	* @param $action string
	* @return object
	*/

	private function _form($data = array(), $errors = array(), $action = 'add')
	{
		// обратите внимание, форма создается на основе собственного класса.
		$form = new Lord_Form_Form();
		$form->setAction( '/' . $this->_moduleName.
						  '/' . $this->_controllerName.
						  '/' . $action )
			 ->setMethod('post');

		// кодировка
		$charset = $this->_helper->config()->common->charset;

		// роли
		$model = new User();
		$preRoles = $model->getPublicRoles();
		$roles[0] = '';
		foreach($preRoles as $role)
		{
			$roles[$role['id']] = $role['name'];
		}

		if($action == 'add')
		{
			// Используемый собственный элемент Lord_Form_Element_Email
			$email = new Lord_Form_Element_Email('email', array(
				'required'    => true,
				'value'       => (!empty($data['email'])) ? $data['email'] : ''
			));
			$form->addElement($email);
		}
		else
		{
			$email = new Zend_Form_Element_Text('email');
			$email->setLabel($this->view->translate('user_registration_form_email'));
			$email->setAttrib('maxlength', 80);
			$email->addValidator('EmailAddress', true);
			$email->addFilter('StringTrim');
			$email->setRequired(true);
			$email->setValue((!empty($data['email'])) ? $data['email'] : '');
			$form->addElement($email);
		}

		if($action == 'add')
		{
			// Password элемент "Пароль". Значение проверяется
			// валидатором Lord_Validate_Password
			$password = new Zend_Form_Element_Password('password', array(
				'required'    => true,
				'label'       => $this->view->translate('user_registration_form_pass'),
				'maxlength'   => '30',
				'validators'  => array('Password'),
			));
			$form->addElement($password);

			// Элемент "Подтверждение пароля".
			// Проверяется на совпадение с полем "Пароль" валидатором
			// Lord_Validate_EqualInputs
			$passwordApprove = new Zend_Form_Element_Password('password_approve', array(
				'required'    => true,
				'label'       => $this->view->translate('user_registration_form_pass_conf'),
				'maxlength'   => '30',
				'validators'  => array(array('EqualInputs', true, array('password'))),
			));
			$form->addElement($passwordApprove);
		}
		else
		{
			// Роль юзера.
			$role = new Zend_Form_Element_Select('role', array(
				'label'       => $this->view->translate('user_registration_form_role'),
				'multiOptions'=> $roles,
				'required'    => true,
				'filters'     => array('Int'),
				'value'       => (!empty($data['role'])) ? $data['role'] : ''
			));
			$form->addElement($role);
		}

		// Text элемент "Имя". Проверяется на алфавитные символы и цифры,
		// а также на длину
		// Валидатор Alnum использует установленную локаль
		// для определения алфавита символов.
		$name = new Zend_Form_Element_Text('name', array(
			'required'    => true,
			'label'       => $this->view->translate('user_registration_form_name'),
			'maxlength'   => '30',
			'validators'  => array(
				array('Alnum', true, array(true)),
				array('StringLength', true, array(0, 30, $charset))
			 ),
			'filters'     => array('StringTrim'),
			'value'       => (!empty($data['name'])) ? $data['name'] : ''
		));
		$form->addElement($name);

		// Radio элемент "Пол".
		$sex = new Zend_Form_Element_Radio('sex', array(
			'label'       => $this->view->translate('user_registration_form_sex'),
			'multiOptions'=> array('1' => $this->view->translate('user_registration_form_man'),
								   '2' => $this->view->translate('user_registration_form_wom'),
								   '0'=>  $this->view->translate('user_registration_form_anon'),),
			'validators'  => array(array('InArray', true, array(array('1', '2', '0'), true))),
			'value'       => (!empty($data['sex'])) ? $data['sex'] : ''
		));
		// Задаем разделитель пробел, для того что бы
		// радио кнопки располагались в ряд
		$sex->setSeparator(' ');
		$form->addElement($sex);

		// Элемент "Дата рождения". Элемент содержит нестандартный декоратор - javascript календарь
		$dateBirth = new Zend_Form_Element_Text('date_birth', array(
			'label'       => $this->view->translate('user_registration_form_birth_date'),
			'maxlength'   => '10',
			'validators'  => array(array('Date', true, array('yyyy-MM-dd'))),
			'filters'     => array('StringTrim'),
			'value'       => (!empty($data['date_birth'])) ? $data['date_birth'] : ''
		));
		// Удаляем все существующие декораторы, назначенные по умолчанию
		$dateBirth->clearDecorators();
		// Назначаем новые, включая наш декоратор Calendar
		// Это необходимо для того что бы изображение календаря размещалось сразу за полем ввода
		$dateBirth
			->addDecorator('ViewHelper')
			->addDecorator('Calendar')
			->addDecorator('Errors')
			->addDecorator('HtmlTag', array('tag' => 'dd'))
			->addDecorator('Label', array('tag' => 'dt'));
		$form->addElement($dateBirth);

		// Select элемент Возраст.
		$age = new Zend_Form_Element_Select('age', array(
			'label'       => $this->view->translate('user_registration_form_age'),
			'multiOptions'=> array('', '11 - 20', '21 - 30', '31 - 40'),
			'filters'     => array('Int'),
			'value'       => (!empty($data['age'])) ? $data['age'] : ''
		));
		$form->addElement($age);

		// Textarea элемент "О себе"
		$about = new Zend_Form_Element_Textarea('about', array(
			'label'       => $this->view->translate('user_registration_form_about'),
			'rows'        => '5',
			'cols'        => '47',
			'validators'  => array(
				array('StringLength', true, array(0, 5000, $charset))
			 ),
			'filters'     => array('StringTrim'),
			'value'       => (!empty($data['about'])) ? $data['about'] : ''
		));
		$form->addElement($about);

		if($action == 'add')
		{
			// Элемент CAPTCHA, защита от спама
			if($this->_helper->config()->captcha_registration == 1)
			{
				$captcha = new Zend_Form_Element_Captcha('captcha', array(
					'label' => $this->view->translate("user_registration_form_captcha"),
					'captcha' => array(
						'captcha'   => 'Image', // Тип CAPTCHA
						'wordLen'   => 4,       // Количество генерируемых символов
						'width'     => 150,     // Ширина изображения
						'timeout'   => 120,     // Время жизни сессии хранящей символы
						'expiration'=> 300,     // Время жизни изображения в файловой системе
						'font'      => 'design/fonts/arial.ttf',   // Путь к шрифту/ Обязательно отностельный
						'imgDir'    => 'temporary/captcha/', // Путь к изобр. Обязательно отностельный
						'imgUrl'    => $this->view->baseUrl . 'temporary/captcha/', // Адрес папки с изображениями
						'gcFreq'    => 5        // Частота вызова сборщика мусора
					),
				));
				$form->addElement($captcha);
			}

			// Переопределяем сообщение об ошибке для валидатора NotEmpty
			$validatorNotEmpty = new Zend_Validate_NotEmpty();
			$validatorNotEmpty->setMessages(array(
				Zend_Validate_NotEmpty::IS_EMPTY  => 'agreeRules'));
			// Checkbox элемент "Согласен с правилами".
			$agreeRules = new Zend_Form_Element_Checkbox('agreeRules', array(
				'required'    => true,
				'label'       => $this->view->translate('user_registration_form_agree'),
				'filters'     => array('Int'),
				'validators'  => array($validatorNotEmpty),
				'value'       => (!empty($data['agreeRules'])) ? $data['agreeRules'] : ''
			));
			$form->addElement($agreeRules);
		}

		// Айдишник
		$id = $form->createElement('hidden', 'id')
			 ->setValue(($action == 'edit') ? $this->_checkId() : 0);
		$form->addElement($id);


		// Кнопка сабмита
		$form->addElement('submit',
						 'save',
						 array('label' => $this->view->translate('user_registration_form_submit')));

		// ошибки
		$this->_helper->FormErrors($errors, $form);

		return $form;
	}

/*------------------------------------------------------------------------------*/
}
